import utime as time
import ustruct
import hmi_drv

uart_hmi = hmi_drv.HmiDrver()
frame_type = {
    'start_frame': 0x01,
    'data_frame': 0x02,
    'end_frame': 0x03
}

def create_data_frame(frame_type, data=b'', sequence=0):
    """
    创建标准数据帧
    - 帧头 : AA 55 (2字节)
    - 帧类型 : 1字节 (0x01=开始, 0x02=数据, 0x03=结束)
    - 序列号 : 2字节
    - 数据长度 : 2字节
    - 数据内容 : 变长
    - CRC校验 : 1字节
    - 帧尾 : 0D 0A (2字节)
    """
    frame = bytearray()
    frame.extend(b'\xAA\x55')  # 固定帧头
    frame.append(frame_type)   # 帧类型
    frame.extend(ustruct.pack('<H', sequence))  # 序列号
    frame.extend(ustruct.pack('<H', len(data))) # 数据长度
    frame.extend(data)         # 数据内容
    # CRC校验（简化为异或校验）
    crc = 0
    for byte in frame[2:]:  # 跳过帧头
        crc ^= byte
    frame.append(crc)
    frame.extend(b'\x0D\x0A')  # 帧尾
    return frame

def send_data(data):
    # 1. 发送开始帧（包含总行数信息）
    total_lines = len(data)
    start_data = ustruct.pack('<L', total_lines)  # 4字节总行数
    start_frame = create_data_frame(frame_type['start_frame'], start_data, 0)
    uart_hmi.write(start_frame)
    time.sleep(0.1)
    # 2. 发送数据帧（使用传统for循环）
    sequence = 1
    for line in data:
        line_bytes = line.encode('utf-8')
        data_frame = create_data_frame(frame_type['data_frame'], line_bytes, sequence)
        uart_hmi.write(data_frame)
        time.sleep(0.1)
        sequence = sequence + 1
    # 3. 发送结束帧
    end_frame = create_data_frame(0x03, b'', total_lines+1)
    uart_hmi.write(end_frame)
    # 发送完成
    print("The protocol data transmission is complete, totaling:" ,total_lines)

    